
#ifndef __MARCOS_H__
#define __MARCOS_H__

#include <windows.h>  // 系统头文件优先
#include <iostream>
#include <cstring>
#include <chrono>
#include <thread>
#include <future>
#include <functional>
#include <queue>
#include <atomic>
#include <condition_variable>
#include <cmath>
#include <numbers>
#include <vector>
#include <list>
#include <memory>
#include <utility> 


//------------禾川电机--------------------
#define ENC_PER_ROUND_HC      (10000)     //禾川电机输出轴一圈编码器值      (增编)
#define ENC_ABS_PER_ROUND_HC  (10000)    //禾川电机绝对值编码器一圈编码器值 (绝编)
// #define ENC_ABS_PER_ROUND_HC  (131072)    //禾川电机绝对值编码器一圈编码器值 (绝编)

#define MM_2_ENC_HC     (1000.0f)        //1mm 对应1000enc 编码器值   （增编）
#define MM_2_ENC_HC_ABS (1000.0f)       //1mm 对应1000enc 编码器值    (绝编)
// #define MM_2_ENC_HC_ABS (13107.2f)       //1mm 对应1000enc 编码器值    (绝编)

#define ENC_2_MM_HC     (0.001f)        //编码器值转换到 mm  （增编）
#define ENC_2_MM_HC_ABS (0.001f)        //编码器值转换到 mm   (绝编)
// #define ENC_2_MM_HC_ABS (0.0000762939f) //编码器值转换到 mm   (绝编)

#define MM_PER_ROUND_HC (10)     //一圈10mm
#define RATED_SPD_RPS_HC (50)    //3000 RPM  即50 RPS

//-------------意优电机-------------------
#define ENC_PER_ROUND_YY      (6619136)   //意优输出轴一圈编码器值 （增编）
#define ENC_ABS_PER_ROUND_YY  (65536)     //意优输出轴一圈编码器值  (绝编)

#define MAX_ENC_ABS_YY (32767)
#define MIN_ENC_ABS_YY (-32768)

#define DEG_2_ENC_YY     (18386.48889f)   // 一度对应 编码器  （增编）
#define DEG_2ENC_YY_ABS  (182.04444f)      // 一度对应 编码器  (绝编)

#define ENC_2_DEG_YY        (0.000054387763f)   //  编码器 转换到 Deg单位  （增编）
#define ENC_2_DEG_YY_ABS    (0.0054931641f)   //  编码器 转换到 Deg单位   (绝编)

#define DEG_PER_ROUND_YY (360)     //一圈360度
#define RATED_SPD_RPS_YY (0.5f)    //30 RPM  即0.5 RPS

#define TP_DN_STATUS_SUCCES 0

#define MAX_NUM_POS_PTS 40000 //1200

    // using tpDNOriginEncoderStruct = struct{

    // int ex = 0; // 龙门架x编码器值
    // int ey = 0; // 龙门架y编码器值
    // int ez = 0; // 龙门架z编码器值

    // int erx = 0; // 关节电机绕x轴的编码器值
    // int erz = 0; // 关节电机绕z轴的编码器值
    // int ery = 0; // 关节电机绕y轴的编码器值,此值保留，默认为0

    // };

    // using tpDNPositionStruct = struct{

    // int x = 0; // 龙门架x位置
    // int y = 0; // 龙门架y位置
    // int z = 0; // 龙门架z位置

    // int rx = 0; // 关节电机绕x轴的旋转角度
    // int rz = 0; // 关节电机绕z轴的旋转角度
    // int ry = 0; // 关节电机绕y轴的旋转角度,此值保留，默认为0

    // };


    // using tpDNRouteStruct = struct{

    // tpDNPositionStruct pos; // 当前位置

    // int vx = 0; //龙门架 x速度
    // int vy = 0; //龙门架 y速度
    // int vz = 0; //龙门架 z速度

    // int vrx = 0; //关节电机绕 x速度
    // int vry = 0; //关节电机绕 y速度,此值保留，默认为0
    // int vrz = 0; //关节电机绕 z速度

    // int ax = 0; //龙门架 x的加速度
    // int ay = 0; //龙门架 y的加速度
    // int az = 0; //龙门架 z的加速度

    // int arx = 0; //关节电机绕 x轴的加速度
    // int arz = 0; //关节电机绕 z轴的加速度
    // int ary = 0; //关节电机绕 y轴的加速度，此值保留，默认为0

    // };


typedef struct{

    // int ex = 0; // 龙门架x编码器值
    // int ey = 0; // 龙门架y编码器值
    // int ez = 0; // 龙门架z编码器值

    // int erx = 0; // 关节电机绕x轴的编码器值
    // int erz = 0; // 关节电机绕z轴的编码器值
    // int ery = 0; // 关节电机绕y轴的编码器值,此值保留，默认为0

    int ex = 0; // 龙门架x编码器值
    int ey = 0; // 龙门架y编码器值
    int ez_1 = 0; // 龙门架z轴1号编码器值
    int ez_2 = 0; // 龙门架z轴2号编码器值

    int erx = 0; // 关节电机绕x轴的编码器值
    int erz = 0; // 关节电机绕z轴的编码器值
    // int ery = 0; // 关节电机绕y轴的编码器值,此值保留，默认为0

    }tpDNOriginEncoderStruct;

typedef struct{   //旧

    float x = 0; // 龙门架x位置   mm
    float y = 0; // 龙门架y位置
    float z = 0; // 龙门架z位置

    float rx = 0; // 关节电机绕x轴的旋转角度   deg
    float rz = 0; // 关节电机绕z轴的旋转角度
    float ry = 0; // 关节电机绕y轴的旋转角度,此值保留，默认为0

    }tpDNPositionStruct;

typedef struct{

    tpDNPositionStruct pos; // 当前位置

    float vx = 0; //龙门架 x速度
    float vy = 0; //龙门架 y速度
    float vz = 0; //龙门架 z速度  mm/s

    float vrx = 0; //关节电机绕 x速度
    float vry = 0; //关节电机绕 y速度,此值保留，默认为0
    float vrz = 0; //关节电机绕 z速度   deg/s

    float ax = 0; //龙门架 x的加速度    mm/s2
    float ay = 0; //龙门架 y的加速度
    float az = 0; //龙门架 z的加速度

    float arx = 0; //关节电机绕 x轴的加速度  deg/s2
    float ary = 0; //关节电机绕 y轴的加速度，此值保留，默认为0
    float arz = 0; //关节电机绕 z轴的加速度
    
    }tpDNRouteStruct;


//--------------------------内部使用结构体 转换为整型编码器单位--------------------------
typedef struct{

    int x = 0; // 龙门架x位置
    int y = 0; // 龙门架y位置
    int z_1 = 0; // 龙门架z位置 1电机
    int z_2 = 0; // 龙门架z位置 2电机
    int rx = 0; // 关节电机绕x轴的旋转角度
    int rz = 0; // 关节电机绕z轴的旋转角度
    
    }tpDNPositionStruct_Enc;


typedef struct{

    tpDNPositionStruct_Enc pos; // 当前位置

    int vx = 0; //龙门架 x速度
    int vy = 0; //龙门架 y速度
    int vz = 0; //龙门架 z速度

    int vrx = 0; //关节电机绕 x速度
    int vry = 0; //关节电机绕 y速度,此值保留，默认为0
    int vrz = 0; //关节电机绕 z速度

    int ax = 0; //龙门架 x的加速度
    int ay = 0; //龙门架 y的加速度
    int az = 0; //龙门架 z的加速度

    int arx = 0; //关节电机绕 x轴的加速度
    int ary = 0; //关节电机绕 y轴的加速度，此值保留，默认为0
    int arz = 0; //关节电机绕 z轴的加速度

    }tpDNRouteStruct_Enc;



//---------DO 输出 --------
#define DO1    1
#define DO2    2
#define DO3    3
#define DO4    4

#define DO_ON  1
#define DO_OFF 0

//--------Errcode---------
#define ERR_CANOPEN_TIMEOUT (0xFFFF)

//---------------日志级别-----------------
#define LOG_LVL_TRACE 0
#define LOG_LVL_DEBUG 1
#define LOG_LVL_INFO  2
#define LOG_LVL_WARN  3
#define LOG_LVL_ERROR 4
#define LOG_LVL_CRTICLE 5
#define LOG_LVL_OFF 6


#endif















